package com.zsrt.java.ch01;

/**
 * 模拟链表
 * @author zsrt
 *
 */
public class Link {
	
	private Node head;
	
	public Link(Node head){
		this.head =head;
	}

	
	/**
	 * 添加： 找到最后一个节点(循环然后判断当前节点的下一个节点是否为null)
	 * @param node
	 * @return
	 */
	public void addNode(Node node){
		
		
		Node p=this.head;//将头节点作为当前节点 p代表当前节点
		
		while(p!=null){//如果当前节点不为null
			
			
			if(p.getNext() == null){//说明当前节点是最后1个节点
				
				//增加节点
				p.setNext(node);
				
				break;
				
			}
			//把当前节点的下一个节点赋值给当前节点 循环
			p=p.getNext();
			
		}
		
	}
	
	/**
	 * 打印所有的节点
	 * 
	 * 周末： 
	 * 1： 4中数据结构
	 * 2： 写出单例模式  动态代理  基石  下大功夫
	 */
	public void printAllNodes(){
		Node p =this.head.getNext();//将头节点作为当前节点 p代表当前节点 因为头节点不保存数据
		
		if(p==null){
			System.out.print("链表中没有数据...");
		}else{
			while(p!=null){
				System.out.print(p.getData()+"-->");
				p=p.getNext();
			}
		}
		System.out.println();
	}
	
	
	/**
	 * 删除节点
	 * @param data 数据
	 * @return
	 */
	public void deleteNode(int data){
		
		Node p=this.head;//将头节点作为当前节点 p代表当前节点
		
		while(p!=null){
			
			if(p.getNext().getData() == data){ //找到了3
				p.setNext(p.getNext().getNext());
				break;
			}
			
			p=p.getNext();
			
		}
	}
	
	
	
	
	/**
	 * 比如原链表的数据为3-->9  然后把  6插入到3和9的中间 那么 3就是parentNode  6就是insertNode
	 * 插入1个节点  把insertNode插入到parentNode的后面
	 * @param parentNode  参考的节点      已知
	 * @param insertNode  要插入的节点   已知
	 */
	public void insertNode(Node parentNode, Node insertNode){
		
		Node p=this.head;//将头节点作为当前节点 p代表当前节点
		
		while(p!=null){
			
			if(p.getData() == parentNode.getData()){
				
				//设置要6这个节点的下一个节点为9 当前节点的下一个节点
				insertNode.setNext(p.getNext());
				
				//把当前节点的下1个节点设置成insertNode
				p.setNext(insertNode);
				
				break;
				
			}
			
			//把当前节点的下一个节点赋值给当前节点 循环
			p=p.getNext();
			
		}
		
	}
	

}
